library(tidyverse)
library(ggplot2)
library(plotly)
library(gridExtra)
library(boot)
# Colorblind-friendly palette, found at
# http://www.cookbook-r.com/Graphs/Colors_(ggplot2)/#a-colorblind-friendly-palette
cbbPalette <- c("#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7")
df <- read.csv('a3 csv values.csv')
labelConversion <- setNames(c("Bar", "Pie", "L", "H", "S"),
c("Bar Chart", "Pie Chart", "Luminance", "Hue", "Saturation"))
summaryBarAndPiePlot <- ggplot(df, aes(x = reorder(testType,error), error, fill=testType)) +
stat_summary(fun = mean, geom = "bar") +
stat_summary(fun.data = mean_cl_normal, geom = "errorbar", fun.args = list(mult = 1)) +
ggtitle("Mean Error for all Visualization Types") +
xlab("Visualization Type") +
theme(plot.title = element_text(hjust = 0.5),
legend.position = "none") +
scale_fill_manual(values=cbbPalette) +
scale_x_discrete(breaks = c("Bar", "Pie", "L", "H", "S"),
labels = c("Bar Chart", "Pie Chart", "Luminance", "Hue", "Saturation"))
print(htmltools::tagList(ggplotly(summaryBarAndPiePlot, tooltip = c("y"))))
NULL
summaryBoxPlot <- ggplot(df, aes(x=reorder(testType,error), y=error, fill=testType)) +
geom_boxplot() +
ggtitle("Box Plot of Error for all Visualization Types") +
xlab("Visualization Type") +
theme(plot.title = element_text(hjust = 0.5),
legend.position = "none") +
scale_fill_manual(values=cbbPalette) +
scale_x_discrete(breaks = c("Bar", "Pie", "L", "H", "S"),
labels = c("Bar Chart", "Pie Chart", "Luminance", "Hue", "Saturation"))
print(htmltools::tagList(ggplotly(summaryBoxPlot)))
NULL
summaryDensityPlot <- ggplot(df, aes(x=error, color=testType)) +
geom_density() +
ggtitle("Distribution of Error for all Visualization Types") +
scale_color_manual(values= c("#E69F00", "#F0E442", "#009E73", "#0072B2", "#56B4E9"),
labels = c("Bar Chart", "Pie Chart", "Luminance", "Hue", "Saturation")) +
guides(color=guide_legend(title="Visualization Type")) +
theme(plot.title = element_text(hjust = 0.5))
summaryDensityPlot

for (uniqueID in unique(df$userID)) {
userDF <- subset(df, subset = userID == uniqueID)
if (nrow(userDF) >= 25) {
userSummaryPlot <- ggplot(userDF, aes(x=reorder(testType,error), y=error, fill=testType)) +
stat_summary(fun = mean, geom = "bar") +
stat_summary(fun.data = mean_cl_normal, geom = "errorbar", fun.args = list(mult = 1)) +
ggtitle(paste("Error Summary for User", uniqueID, sep = " ")) +
xlab("Chart Type") +
theme(plot.title = element_text(hjust = 0.5),
legend.position = "none") +
scale_color_manual(values=cbbPalette) +
scale_x_discrete(breaks = c("Bar", "Pie", "L", "H", "S"),
labels = c("Bar Chart", "Pie Chart", "Luminance", "Hue", "Saturation"))
print(htmltools::tagList(ggplotly(userSummaryPlot, tooltip=c("y"))))
}
}
NA
LS0tDQp0aXRsZTogIkVycm9yIEFuYWx5c2lzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShncmlkRXh0cmEpDQpsaWJyYXJ5KGJvb3QpDQoNCg0KDQojIENvbG9yYmxpbmQtZnJpZW5kbHkgcGFsZXR0ZSwgZm91bmQgYXQgDQojIGh0dHA6Ly93d3cuY29va2Jvb2stci5jb20vR3JhcGhzL0NvbG9yc18oZ2dwbG90MikvI2EtY29sb3JibGluZC1mcmllbmRseS1wYWxldHRlDQoNCmNiYlBhbGV0dGUgPC0gYygiI0U2OUYwMCIsICIjNTZCNEU5IiwgIiMwMDlFNzMiLCAiI0YwRTQ0MiIsICIjMDA3MkIyIiwgIiNENTVFMDAiLCAiI0NDNzlBNyIpDQoNCmRmIDwtIHJlYWQuY3N2KCdhMyBjc3YgdmFsdWVzLmNzdicpDQoNCmxhYmVsQ29udmVyc2lvbiA8LSBzZXROYW1lcyhjKCJCYXIiLCAiUGllIiwgIkwiLCAiSCIsICJTIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiQmFyIENoYXJ0IiwgIlBpZSBDaGFydCIsICJMdW1pbmFuY2UiLCAiSHVlIiwgIlNhdHVyYXRpb24iKSkNCg0Kc3VtbWFyeUJhckFuZFBpZVBsb3QgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IHJlb3JkZXIodGVzdFR5cGUsZXJyb3IpLCBlcnJvciwgZmlsbD10ZXN0VHlwZSkpICsNCiAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAiYmFyIikgKw0KICBzdGF0X3N1bW1hcnkoZnVuLmRhdGEgPSBtZWFuX2NsX25vcm1hbCwgZ2VvbSA9ICJlcnJvcmJhciIsIGZ1bi5hcmdzID0gbGlzdChtdWx0ID0gMSkpICsNCiAgZ2d0aXRsZSgiTWVhbiBFcnJvciBmb3IgYWxsIFZpc3VhbGl6YXRpb24gVHlwZXMiKSArDQogIHhsYWIoIlZpc3VhbGl6YXRpb24gVHlwZSIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Y2JiUGFsZXR0ZSkgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IGMoIkJhciIsICJQaWUiLCAiTCIsICJIIiwgIlMiKSwNCiAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJCYXIgQ2hhcnQiLCAiUGllIENoYXJ0IiwgIkx1bWluYW5jZSIsICJIdWUiLCAiU2F0dXJhdGlvbiIpKQ0KDQpwcmludChodG1sdG9vbHM6OnRhZ0xpc3QoZ2dwbG90bHkoc3VtbWFyeUJhckFuZFBpZVBsb3QsIHRvb2x0aXAgPSBjKCJ5IikpKSkNCg0Kc3VtbWFyeUJveFBsb3QgPC0gZ2dwbG90KGRmLCBhZXMoeD1yZW9yZGVyKHRlc3RUeXBlLGVycm9yKSwgeT1lcnJvciwgZmlsbD10ZXN0VHlwZSkpICsNCiAgICAgICAgICAgICAgICAgIGdlb21fYm94cGxvdCgpICsNCiAgICAgICAgICAgICAgICAgIGdndGl0bGUoIkJveCBQbG90IG9mIEVycm9yIGZvciBhbGwgVmlzdWFsaXphdGlvbiBUeXBlcyIpICsNCiAgICAgICAgICAgICAgICAgIHhsYWIoIlZpc3VhbGl6YXRpb24gVHlwZSIpICsNCiAgICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogICAgICAgICAgICAgICAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9Y2JiUGFsZXR0ZSkgKw0KICAgICAgICAgICAgICAgICAgc2NhbGVfeF9kaXNjcmV0ZShicmVha3MgPSBjKCJCYXIiLCAiUGllIiwgIkwiLCAiSCIsICJTIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkJhciBDaGFydCIsICJQaWUgQ2hhcnQiLCAiTHVtaW5hbmNlIiwgIkh1ZSIsICAgICJTYXR1cmF0aW9uIikpDQoNCnByaW50KGh0bWx0b29sczo6dGFnTGlzdChnZ3Bsb3RseShzdW1tYXJ5Qm94UGxvdCkpKQ0KDQpzdW1tYXJ5RGVuc2l0eVBsb3QgPC0gZ2dwbG90KGRmLCBhZXMoeD1lcnJvciwgY29sb3I9dGVzdFR5cGUpKSArIA0KICBnZW9tX2RlbnNpdHkoKSArDQogIGdndGl0bGUoIkRpc3RyaWJ1dGlvbiBvZiBFcnJvciBmb3IgYWxsIFZpc3VhbGl6YXRpb24gVHlwZXMiKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9IGMoIiNFNjlGMDAiLCAiI0YwRTQ0MiIsICIjMDA5RTczIiwgIiMwMDcyQjIiLCAiIzU2QjRFOSIpLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQmFyIENoYXJ0IiwgIlBpZSBDaGFydCIsICJMdW1pbmFuY2UiLCAiSHVlIiwgIlNhdHVyYXRpb24iKSkgKw0KICBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKHRpdGxlPSJWaXN1YWxpemF0aW9uIFR5cGUiKSkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCg0KDQpzdW1tYXJ5RGVuc2l0eVBsb3QNCg0KZm9yICh1bmlxdWVJRCBpbiB1bmlxdWUoZGYkdXNlcklEKSkgew0KDQogIHVzZXJERiA8LSBzdWJzZXQoZGYsIHN1YnNldCA9IHVzZXJJRCA9PSB1bmlxdWVJRCkNCiAgDQogIGlmIChucm93KHVzZXJERikgPj0gMjUpIHsNCiAgDQogICAgdXNlclN1bW1hcnlQbG90IDwtIGdncGxvdCh1c2VyREYsIGFlcyh4PXJlb3JkZXIodGVzdFR5cGUsZXJyb3IpLCB5PWVycm9yLCBmaWxsPXRlc3RUeXBlKSkgKw0KICAgIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gImJhciIpICsNCiAgICBzdGF0X3N1bW1hcnkoZnVuLmRhdGEgPSBtZWFuX2NsX25vcm1hbCwgZ2VvbSA9ICJlcnJvcmJhciIsIGZ1bi5hcmdzID0gbGlzdChtdWx0ID0gMSkpICsNCiAgICBnZ3RpdGxlKHBhc3RlKCJFcnJvciBTdW1tYXJ5IGZvciBVc2VyIiwgdW5pcXVlSUQsIHNlcCA9ICIgIikpICsNCiAgICB4bGFiKCJDaGFydCBUeXBlIikgKw0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLA0KICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9Y2JiUGFsZXR0ZSkgKw0KICAgIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzID0gYygiQmFyIiwgIlBpZSIsICJMIiwgIkgiLCAiUyIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJCYXIgQ2hhcnQiLCAiUGllIENoYXJ0IiwgIkx1bWluYW5jZSIsICJIdWUiLCAgICAiU2F0dXJhdGlvbiIpKQ0KICANCiAgICBwcmludChodG1sdG9vbHM6OnRhZ0xpc3QoZ2dwbG90bHkodXNlclN1bW1hcnlQbG90LCB0b29sdGlwPWMoInkiKSkpKQ0KICAgIA0KICB9DQp9DQoNCmBgYA0KDQo=